查看原文
其他

密码学中常见加密算法的python模块整理

本文整理了如何应用python库实现密码学中常见的加密算法。文中简单介绍了各个加密算法,并且给出了实现代码。
1

MD5算法
MD5是一种被广泛使用的线性散列算法,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整的一致性。且MD5处理之后产生的是一个固定长度(32位或16位)的数据。
常规讲MD5是不存在解密的。但是理论上MD5是可以进行反向暴力破解的。暴力破解的大致原理就是用很多不同的数据进行加密后跟已有的加密数据进行对比,由此来寻找规律。理论上只要数据量足够庞大MD5是可以被破解的。但是要注意,破解MD5是需要考虑破解的成本(时间和机器性能)。假设破解当前的MD5密码需要目前计算能力最优秀的计算机工作100年才能破解完成。那么当前的MD5密码就是安全的。
增加破解成本的方法使用一段无意义且随机的私匙进行MD5加密会生成一个加密串,我们暂且称之为串1 将要加密的的数据跟串1拼接,再进行一次MD5,这时会生成串2 将串2再次进行MD5加密,这时生成的串3就是我们加密后的数据。

注:我们在注册账号时的密码一般都是用MD5进行加密

import hashlibh = hashlib.md5()
str = 'boboadmin'
h.update(str.encode())
msg = h.hexdigest()
print(msg)

增加破解成本的方法SHA1比MD5的安全性更强,但也比MD5慢import hashlib
sha1 = hashlib.sha1()
data = '2333333'
sha1.update(data.encode('utf-8'))
sha1_data = sha1.hexdigest()
print(sha1_data)


2

Base64伪加密

Base64是一种用64个字符来表示任意二进制数据的方法。base64是一种编码方式而不是加密算法。只是看上去像是加密而已。Base64使用A–Z,a–z,0–9,+,/ 这64个字符实现对数据进行加密。

import base64
str='admin'
str=str.encode('utf-8')
#加密
bs64=base64.b64encode(str)
print(bs64)
#解密
debs64=base64.b64decode(bs64)
print(debs64.decode())



3

DES/AES

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的算法。该加密算法是一种对称加密方式,其加密运算、解密运算需要使用的是同样的密钥(一组字符串)即可。AES全称为Advanced Encryption Standard,即高级加密标准,现在用AES这个标准替代原来的DES。


AES和DES的区别

加密后密文长度不同:

  • DES加密后,密文长度是8的整数倍

  • AES加密后,密文长度是16的整数倍

应用场景不同:

  • 企业级开发使用DES足够安全

  • 如果要求高,使用AES

  • 使用DES/AES进行数据交换时,要求双方都拥有相同的私钥



破解方法

  1. 暴力破解

  2. DES如果使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。只要计算足够强大是可以被破解的

#需要下载安装pyDes模块
import binascii
from pyDes import des, CBC, PAD_PKCS5

def des_encrypt(secret_key,s):
iv = secret_key
k = des(secret_key,CBC,iv,pad=None,padmode=PAD_PKCS5)
en = k.encrypt(s,padmode=PAD_PKCS5)
return binascii.b2a_hex(en)

def des_decrypt(secret_key, s):
iv = secret_key
k = des(secret_key,CBC,iv,pad = None,padmode = PAD_PKCS5)
de = k.decrypt(binascii.a2b_hex(s),padmode = PAD_PKCS5)
return desecret_str = des_encrypt('12345678', 'I love YOU~')
print(secret_str)
clear_str = des_decrypt('12345678', secret_str)
print(clear_str)




4

RSA

RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。

非对称加密

非对称加密算法需要两个密钥:

  • 公开密钥(publickey:简称公钥)

  • 私有密钥(privatekey:简称私钥)

  • 公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。


注:

  • 使用时都是使用公匙加密使用私匙解密。公匙可以公开,私匙自己保留。

  • 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。


使用流程和场景介绍

  • 通过公匙加密,使用私匙解密。私匙是通过公匙计算生成的。假设ABC三方之间相互要进行加密通信。大家相互之间使用公匙进行信息加密,信息读取时使用各自对应的私匙进行信息解密

  • 用户输入的支付密码会通过RSA加密

公钥私钥生成方式

import rsa

def rsaEncrypt(str):
    (pubkey,privkey)=rsa.newkeys(512)
    print("pub:",pubkey)
    print("priv:",privkey)

    content =str.encode('utf-8')

    crypto=rsa.encrypt(content,pubkey)
    return (crypto,privkey)

def rsaDecrypt(str,pk):
    content = rsa.decrypt(str,pk)
    con=content.decode('utf-8')
    return con

(deData,privKey)=rsaEncrypt("hello")
print('加密后的密文',deData)
content = rsaDecrypt(deData,privKey)
print(content)




5

一次性密码密码

这个问题可以转换为一个半正定规划问题,从而被高效地求解。

一次性密码密码是一种Vignere密码,包括以下功能;

  • 是一个牢不可破的密码.

  • 密钥与加密邮件的长度完全相同.

  • 密钥由随机符号组成.

  • 顾名思义,密钥仅使用一次,并且从不再用于任何其他消息加密.

由于这个原因,加密邮件很容易受到密码分析者的攻击.用于一次性密码密码的密钥称为 pad ,因为它打印在纸垫上.


为什么它是坚不可摧的?


由于以下功能,密钥是牢不可破的;

  • 密钥只要是给定的消息.

  • 密钥是真正随机的,特别是自动生成的.

  • 按模10/26/2计算的密钥和纯文本.

  • 每个密钥应使用一次,并由发送方和接收方销毁.

  • 应该有两个密钥副本:一个带发件人,另一个带接收者.


加密

要加密字母,用户需要在明文下面写一个密钥.明文字母位于顶部,密钥字母位于左侧.两个字母之间的横截面是纯文本.它在下面的示例中描述 :


解密

要解密一封信,用户会取左边的关键字母,并在该行中找到密文字母.纯文本字母位于列的顶部,用户可以在其中找到密文字母.

实现

Python包含一个用于 one-time-pad 密码实现的hacky实现模块.包名称称为One-Time-Pad,其中包括一个命令行加密工具,该工具使用类似于一次性密码密码算法的加密机制.

安装

您可以使用以下命令安装此模块 :

pip install onetimepad

如果您希望从命令行使用它,请运行以下命令 :

onetimepad


代码

以下代码有助于生成一次性密码密码;

import onetimepad
cipher = onetimepad.encrypt('One Time Cipher''random')
print("Cipher text is ")
print(cipher)
print("Plain text is ")
msg = onetimepad.decrypt(cipher, 'random')
print(msg)


代码

运行上面和下面给出的代码时,您可以观察到以下输出;

注意 : 如果密钥的长度小于消息的长度(纯文本),则加密的消息很容易破解.


参考来源:digit1234
END


往期推荐


《密码学报》“新环境下的密码应用” 专栏‍征稿启事
并行联邦学习:一种具有理论保证的联邦学习加速方案
联邦学习 (FL) 中常见的3种模型聚合方法的 Tensorflow 代码示例
Graph-Fraudster:面向图垂直联邦学习的对抗攻击
欢迎投稿邮箱:pet@openmpc.com参与更多讨论,请添加小编微信加入交流群

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存